
context("instrument")

test_that("negatives", {

  negs <- list(
    function() {},
    function() { "foobar"; print(1:10) },
    function() { "blah !BEBUG"; print(NULL) },
    base::ls,
    base::library
  )

  for (f in negs) {
    f2 <- instrument(f)
    ## Not identical because of the srcrefs
    expect_equal(f, f2)
    expect_identical(formals(f), formals(f2))
    expect_equal(body(f), body(f2))
  }
})

test_that("positives", {

  poss <- list(
    function() { "!DEBUG foobar1" },
    function(x = "!DEBUG foobar1") { x == "really?" },
    function() { for (i in 1:1) { if (TRUE) { "!DEBUG foobar1" } } }
  )

  for (f in poss) {
    f2 <- instrument(f)
    expect_output(f2(), "foobar1")
  }
})

test_that("functions without arguments, #17", {

  f <- function() { "!DEBUG foo"; 'noarg' }
  f2 <- instrument(f)
  expect_output(instrument(f2()), "foo")
})

test_that("unknown objects are not touched", {
  e <- new.env()
  expect_equal(format(e), format(instrument(e)))
})

test_that("debug levels", {
  f <- function() {
    for (i in 1:1) {
      if (TRUE) {
        "!DEBUG foobar1"
      }
      "!!DEBUG foobar2"
    }
    "!!!DEBUG foobar3"
  }
  f2 <- instrument(f)

  expect_output(f2(), "foobar1.*foobar2.*foobar3")
})

test_that("function with attributes", {
  f <- function() {}
  attr(f, "foo") <- "bar"

  f2 <- instrument(f)
  expect_identical(attributes(f), attributes(f2))
})

test_that("circular references", {
  env <- new.env()
  env$l <- list(x = env)
  expect_error(instrument(env), NA)
})
